﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace NDF.Framework.Models.Entities
{
    /// <summary>
    /// 表示 NetDirkFramework(NDF) 框架中所有数据实体对象的基类。
    /// 该实体基类提供对主键数据类型的泛型定义。
    /// </summary>
    [Serializable]
    public abstract class EntityBase<TKey>
    {
        /// <summary>
        /// 初始化一个 <see cref="EntityBase"/> 类型实例。
        /// </summary>
        protected EntityBase()
        {
            this.Key = default(TKey);
            this.CreateDate = DateTime.Now;
            this.LastModifyDate = DateTime.Now;
        }



        /// <summary>
        /// 获取或设置一个 <see cref="Int32"/> 值，该值表示实体对象的标识属性。这是一个自增长字段。
        /// </summary>
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public virtual int ID { get; set; }

        /// <summary>
        /// 获取或设置一个 <see cref="TKey"/> 类型值，该值表示实体对象的主键属性。
        /// </summary>
        [Key]
        public virtual TKey Key { get; set; }




        /// <summary>
        /// 获取或设置一个 <see cref="Byte"/> 值，该值表示实体对象的数据逻辑类型。该字段为扩展预留字段。
        /// </summary>
        public virtual byte Type { get; set; }

        /// <summary>
        /// 获取或设置一个 <see cref="Byte"/> 值，该值表示实体对象的数据标记。该字段为扩展预留字段。
        /// </summary>
        public virtual EntityFlag Flag { get; set; }

        /// <summary>
        /// 获取或设置一个 <see cref="Byte"/> 值，该值表示实体对象的数据状态。该字段为扩展预留字段。
        /// </summary>
        public virtual byte Status { get; set; }

        
        
        
        /// <summary>
        /// 获取或设置一个 <see cref="Guid"/> 值，该值表示实体对象的数据创建者。
        /// </summary>
        public virtual Guid? CreateUser { get; set; }

        /// <summary>
        /// 获取或设置一个 <see cref="DateTime"/> 值，该值表示实体对象的数据创建时间。
        /// </summary>
        [DataType(DataType.DateTime)]
        public virtual DateTime CreateDate { get; set; }

        /// <summary>
        /// 获取或设置一个 <see cref="Guid"/> 值，该值表示实体对象的数据最后修改者。
        /// </summary>
        public virtual Guid? LastModifyUser { get; set; }

        /// <summary>
        /// 获取或设置一个 <see cref="DateTime"/> 值，该值表示实体对象的数据最后修改时间。
        /// </summary>
        [DataType(DataType.DateTime)]
        public virtual DateTime LastModifyDate { get; set; }
    }
}
